package ln.fxspringarchetype.util;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 有关时间日期互转的一些工具方法
 * String，Date，LocalDate
 */
public class DateUtil {
    /**
     * 本地时区标识
     */
    public static final ZoneId ZONE_ID = ZoneId.systemDefault();
    /**
     * ISO日期格式化器
     * 格式样例 2011-12-03
     */
    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_DATE;

    /**
     * 日期转换为本地日期
     *
     * @param date 日期
     * @return 本地日期
     */
    public static LocalDate dateToLocalDate(Date date) {
        Instant instant = date.toInstant();
        return LocalDate.ofInstant(instant, ZONE_ID);
    }

    /**
     * 本地日期转换为日期
     *
     * @param localDate 本地日期
     * @return 日期
     */
    public static Date localDateToDate(LocalDate localDate) {
        //先把时刻校正到本地日期的0点整
        Instant instant = localDate.atStartOfDay(ZONE_ID).toInstant();
        return Date.from(instant);
    }

    /**
     * 本地日期转换为ISO字符串
     *
     * @param localDate 本地日期
     * @return ISO字符串
     */
    public static String localDateToDateString(LocalDate localDate) {
        return localDate.format(DATE_FORMATTER);
    }

    /**
     * 将ISO字符串转换为本地日期
     *
     * @param isoString ISO字符串
     * @return 本地日期
     */
    public static LocalDate dateStringToLocalDate(String isoString) {
        return LocalDate.parse(isoString, DATE_FORMATTER);
    }

    /**
     * 从日期得到ISO字符串
     *
     * @param date 日期
     * @return ISO字符串
     */
    public static String dateToDateString(Date date) {
        return localDateToDateString(dateToLocalDate(date));
    }

    /**
     * 从ISO字符串得到日期
     *
     * @param dateString ISO格式日期字符串
     * @return 日期
     */
    public static Date dateStringToDate(String dateString) {
        return localDateToDate(dateStringToLocalDate(dateString));
    }

}
